package models;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.Table;
import javax.persistence.Transient;

import services.DAO;

@Entity
@IdClass(CalificacionPeriodoId.class)
@Table(name = "calificacion_periodo")
@NamedNativeQueries({
		@NamedNativeQuery(name = CalificacionPeriodo.CALIFICACIONES_CORTE, query = "select e.id,p.apellidos, p.nombres,cc.nota from estudiante e join persona p on p.id=e.id_persona join matricula m on m.id_estudiante=e.id order by p.apellidos,p.nombres"
				+ "left join calificacion_periodo cc on e.id=cc.id_estudiante AND cc.id_periodo=?idPeriodo AND cc.id_materia=?idMateria WHERE m.id_curso=?idCurso"),
		@NamedNativeQuery(name = CalificacionPeriodo.MISSING_GRADES, query = "select distinct perprofe.nombres||' '||perprofe.apellidos,mater.nombre,c.nombre from curso c join matricula m on c.id=m.id_curso "
				+ "join materia_grado mg on c.id_grado=mg.id_Grado "
				+ "join materia mater on mater.id=mg.id_materia "
				+ "join materia_curso mc on mc.id_materia=mg.id_materia and mc.id_curso=c.id "
				+ "join profesor profe on profe.id=mc.id_profesor "
				+ "join persona perprofe on perprofe.id=profe.id_persona "
				+ "left join calificacion_periodo cc "
				+ "on cc.id_materia=mg.id_materia and cc.id_grado=mg.id_grado and cc.id_estudiante=m.id_Estudiante and cc.id_periodo=?idPeriodo "
				+ "where  c.id_calendario_academico=?idCalendarioAcademico AND cc.nota is null") })
public class CalificacionPeriodo extends models.Entity<CalificacionPeriodoId> {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public static final String CALIFICACIONES_CORTE = "getCalificacionesPeriodo";
	public static final String MISSING_GRADES = "missingGrades";
	@Id
	@Column(name = "id_estudiante")
	private Long idEstudiante;
	@Id
	@Column(name = "id_periodo")
	private Long idPeriodo;
	@Id
	@Column(name = "id_materia")
	private Long idMateria;
	@Id
	@Column(name = "id_grado")
	private Long idGrado;
	@Column(name = "nota_numerica")
	private Double notaNumerica;

	private String nota;
	@Transient
	private Estudiante estudiante;

	public CalificacionPeriodo() {
	}

	public CalificacionPeriodo(Long idEstudiante, Long idPeriodo,
			Long idMateria, Long idGrado, String nota) {

		this.idEstudiante = idEstudiante;
		this.setIdPeriodo(idPeriodo);
		this.idMateria = idMateria;
		this.idGrado = idGrado;
		this.nota = nota;
	}

	public Long getIdEstudiante() {
		return idEstudiante;
	}

	public void setIdEstudiante(Long idEstudiante) {
		this.idEstudiante = idEstudiante;
	}

	public Long getIdCalendario() {
		return getIdPeriodo();
	}

	public void setIdCalendario(Long idCalendario) {
		this.setIdPeriodo(idCalendario);
	}

	public Long getIdMateria() {
		return idMateria;
	}

	public void setIdMateria(Long idMateria) {
		this.idMateria = idMateria;
	}

	public Long getIdGrado() {
		return idGrado;
	}

	public void setIdGrado(Long idGrado) {
		this.idGrado = idGrado;
	}

	@Override
	public CalificacionPeriodoId getId() {

		return new CalificacionPeriodoId(idEstudiante, getIdPeriodo(),
				idMateria, idGrado);
	}

	@Override
	public void setId(CalificacionPeriodoId id) {
		idEstudiante = id.getIdEstudiante();
		setIdPeriodo(id.getIdPeriodo());
		idMateria = id.getIdMateria();
		idGrado = id.getIdGrado();
	}

	public Estudiante getEstudiante() {
		if (estudiante == null)
			estudiante = DAO.find(Estudiante.class, idEstudiante);
		return estudiante;

	}

	public String getNota() {
		return nota;
	}

	public void setNota(String nota) {
		this.nota = nota;
	}

	public void setEstudiante(Estudiante e) {
		estudiante = e;

	}

	public Long getIdPeriodo() {
		return idPeriodo;
	}

	public void setIdPeriodo(Long idPeriodo) {
		this.idPeriodo = idPeriodo;
	}

	public Double getNotaNumerica() {
		return notaNumerica;
	}

	public void setNotaNumerica(Double notaNumerica) {
		this.notaNumerica = notaNumerica;
	}

}
